package com.zjl.redis.第19章_IO多路复用;

/**
 * ●I/O:网络I/O
 * ●多路:多个客户端连接(连接就是套接字描述符,即socket或者channel) ，指的是多条TCP连接
 * ●复用:用一个进程来处理多条的连接,使用单进程就能够实现同时处理多个客户端的连接
 *
 *  实现了用一个进程来处理大量的用户连接,IO多路复用类似一个规范和接口，落地实现
 *
 *
 * Redis利用epoll来实现IO多路复用，将连接信息和事件放到队列中，
 * 一次放到文件事件分派器，事件分派器将事件分发给事件处理器。
 *
 *
 * Redis是跑在单线程中的，所有的操作都是按照顺序线性执行的，
 * 但是由于读写操作等待用户输入或输出都是阻塞的，
 * 所以I/O操作在一般情况下往往不能直接返回，这会导致某一文件的I/O阻塞导致整个进程无法对其它客户提供服务，
 * 而I/O多路复用就是为了解决这个问题而出现
 *
 * 所谓I/O多路复用机制，就是说通过一种机制，可以监视多个描述符，
 * 一旦某个描述符就绪(一般是读就绪或写就绪)，能够通知程序进行相应的读写操作。
 * 这种机制的使用需要select、poll 、epoll 来配合。
 * 多个连接共用一个阻塞对象，应用程序只需要在一个阻塞对象上等待，无需阻塞等待所有连接。
 * 当某条连接有新的数据可以处理时，操作系统通知应用程序，线程从阻塞状态返回，开始进行业务处理。
 *
 * Redis服务采用Reactor的方式来实现文件事件处理器(每一个网络连接其实都对应一个文件描述符)
 * Redis基于Reactor模式开发了网络事件处理器，这个处理器被称为文件事件处理器。
 *      它的组成结构为4部分:
 *          多个套接字、
 *          IO多路复用程序、
 *          文件事件分派器、
 *          事件处理器。
 *
 * 因为文件事件分派器队列的消费是单线程的，所以Redis才叫单线程模型
 *
 * Redis基于Reactor模式开发了自己的网络事件处理器:
 *      这个处理器被称为文件事件处理器
 *    ●文件事件处理器使用I/O多路复用(multiplexing) 程序来同时监听多个套接字，
 *      并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
 *    ●当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close) 等操作时，
 *    与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
 *
 * 虽然文件事件处理器以单线程方式运行，但通过使用I/O多路复用程序来监听多个套接字，
 * 文件事件处理器既实现了高性能的网络通信模型又可以很好地与Redis服务器中其他同样以单线程方式运行的模块进行对接,
 * 这保持了Redis内部单线程设计的简单性。
 *
 *
 */
public class A_IO多路复用概念 {

}
